home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 301_02 / trigger.c < prev    next >
Text File  |  1989-12-28  |  39KB  |  1,143 lines

  1. /*
  2. HEADER:        ;
  3. TITLE: trigger.c   
  4.        trigonometric implementations of the Borland Graphics Interface;
  5. VERSION:  1.0;
  6.  
  7. DESCRIPTION: horsing around with trig functions and the Borland Graphics
  8.    Interface (BGI).  This program was created and run on a Compaq Plus
  9.    and an IBM AT with a CGA card using Borland's TurboC 2.0.  Routines
  10.    and variables with a single, initial capital letter (i.e. MainWindow())
  11.    are taken directly from the demo program accompanying TurboC 2.0.
  12.    The file CGA.BGI is likewise directly from the TurboC disk.  In theory
  13.    by including a .BGI file for every conceivable combination of video
  14.    cards and allowing the program to auto detect the card one could make it
  15.    universally adaptable.  In this case, however, the medium resolution
  16.    mode of the CGA card is forced.  To allow for other cards, one could
  17.    initiate the sequence--
  18.            GraphDriver = DETECT;
  19.            initgraph( &GraphDriver, &GraphMode, "" );
  20.    but this would require all of the *.BGI files to be available on disk
  21.    or compiled within the program.
  22.    In addition several of the Borland routines are specific to IBM and
  23.    close compatibles so that the program is not very portable as written.
  24.    The Borland file 'graphics.h' contains the definitions for many of the
  25.    global variables specific for their functions (e.g. DETECT).
  26.  
  27. KEYWORDS: trig functions, BGI, Borland Graphics Interface, TurboC;
  28. SYSTEM:   MSDOS;
  29. FILENAME: TRIGGER.C;
  30. WARNINGS: Expects CGA card, will not run on monochrome
  31.           must have CGA.BGI on same directory or path to it;
  32. SEE-ALSO: TRIGGER.EXE;
  33. AUTHORS:  Henry Pollock;
  34. COMPILERS:  TurboC 2.0;
  35. */
  36.  
  37. /*
  38. --  TRIGGER.C  horsing around with trig functions and the Borland Graphics
  39. --             Interface (BGI).
  40. --                               Henry Pollock
  41. --                               Essex Center Drive
  42. --                               Peabody, MA 01960
  43. --                               7/15/89
  44. */
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52. #include <conio.h>
  53. #include <dos.h>
  54. #include <graphics.h>
  55. #include <math.h>
  56. #include <stdarg.h>
  57. #include <stdio.h>
  58. #include <stdlib.h>
  59.  
  60. #define CTR_X_ORIGIN X_OFFSET + (MaxX - X_OFFSET)/2
  61. #define CTR_Y_ORIGIN Y_OFFSET + (MaxY - Y_OFFSET)/2
  62. #define ESC    0x1b           /* Define the escape key */
  63. #define FALSE  0              /* Define some handy constants     */
  64. #define OFF    0              /* Define some handy constants     */
  65. #define ON     1              /* Define some handy constants     */
  66. #define PI     3.14159        /* Define a value for PI */
  67. #define SW_X_ORIGIN X_OFFSET
  68. #define SW_Y_ORIGIN MaxY - Y_OFFSET
  69. #define TRUE   1              /* Define some handy constants     */
  70.  
  71.  
  72.  
  73.  
  74.  
  75. double AspectRatio;      /* Aspect ratio of a pixel on the screen*/
  76. int    ErrorCode;        /* Reports any graphics errors          */
  77. int    GraphDriver;      /* The Graphics device driver      */
  78. int    GraphMode;        /* The Graphics mode value         */
  79. int    MaxColors;        /* The maximum # of colors available    */
  80. int    MaxX, MaxY;       /* The maximum resolution of the screen */
  81. int    X_OFFSET = 0;
  82. int    Y_OFFSET = 0;
  83.  
  84.  
  85. /*Routines from Borland Demo Disk */
  86. int  gprintf(int *xloc, int *yloc, char *fmt, ... );
  87. void changetextstyle(int font, int direction, int charsize);
  88. void DrawBorder(void);
  89. void Initialize(void);
  90. void MainWindow(char *header);
  91. void StatusLine(char *msg);
  92.  
  93. /*Trig routines*/
  94.  
  95. int menu();
  96. int scale_x(float *, float *);
  97. int scale_y(float *, float *);
  98. void asteroid();
  99. void autoloid();
  100. void circloid();
  101. void cycloids();
  102. void ctr_graph_plot();
  103. void draw_circleoid(int *, int *, float *);
  104. void get_params2(float *power);
  105. void get_params8(char *cycloid, int *cusps);
  106. void draw_roulette(char *cycloid, int *cusps);
  107. void lissajous();
  108. void logo();
  109. void spiral();
  110. void sw_graph_plot();
  111. void tschirnhausen();
  112. void roulettes();
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120. void changetextstyle(int font, int direction, int charsize)
  121. {
  122.     int ErrorCode;
  123.  
  124.     graphresult();              /* clear error code      */
  125.     settextstyle(font, direction, charsize);
  126.     ErrorCode = graphresult();       /* check result          */
  127.     if( ErrorCode != grOk ){         /* if error occured      */
  128.         closegraph();
  129.         printf(" Graphics System Error: %s\n", grapherrormsg( ErrorCode ) );
  130.         exit( 1 );
  131.     }
  132. }
  133.  
  134.  
  135. int gprintf( int *xloc, int *yloc, char *fmt, ... )
  136. {
  137.     va_list  argptr;            /* Argument list pointer */
  138.     char str[140];              /* Buffer to build sting into */
  139.     int cnt;                    /* Result of SPRINTF for return */
  140.  
  141.     va_start( argptr, format );      /* Initialize va_ functions   */
  142.  
  143.     cnt = vsprintf( str, fmt, argptr );   /* prints string to buffer    */
  144.     outtextxy( *xloc, *yloc, str );  /* Send string in graphics mode */
  145.     *yloc += textheight( "H" ) + 2;       /* Advance to next line         */
  146.  
  147.     va_end( argptr );           /* Close va_ functions        */
  148.  
  149.     return( cnt );              /* Return the conversion count     */
  150.  
  151. }
  152.  
  153. void DrawBorder(void)
  154. {
  155.     struct viewporttype vp;
  156.  
  157.     setcolor( MaxColors - 1 );       /* Set current color to white */
  158.  
  159.     setlinestyle( SOLID_LINE, 0, NORM_WIDTH );
  160.  
  161.     getviewsettings( &vp );
  162.     rectangle( 0, 0, vp.right-vp.left, vp.bottom-vp.top );
  163.  
  164. }
  165.  
  166.  
  167. void MainWindow( char *header )
  168. {
  169.     int height;
  170.  
  171.     cleardevice();              /* Clear graphics screen */
  172.     setcolor( MaxColors - 1 );       /* Set current color to white */
  173.     setviewport( 0, 0, MaxX, MaxY, 1 );   /* Open port to full screen   */
  174.  
  175.     height = textheight( "H" );           /* Get basic text height        */
  176.  
  177.     changetextstyle( DEFAULT_FONT, HORIZ_DIR, 1 );
  178.     settextjustify( CENTER_TEXT, TOP_TEXT );
  179.     outtextxy( MaxX/2, 2, header );
  180.     setviewport( 0, height+4, MaxX, MaxY-(height+4), 1 );
  181.     DrawBorder();
  182.     setviewport( 1, height+5, MaxX-1, MaxY-(height+5), 1 );
  183.  
  184. }
  185.  
  186.  
  187. void Initialize(void)
  188. {
  189.     int xasp, yasp;             /* Used to read the aspect ratio*/
  190.  
  191.     GraphDriver = CGA;         /* force cga                  */
  192.     GraphMode   = CGAC1;       /* cyan,magenta,white         */
  193.     initgraph( &GraphDriver, &GraphMode, "" );
  194.     ErrorCode = graphresult();       /* Read result of initialization*/
  195.     if( ErrorCode != grOk ){         /* Error occured during init  */
  196.         printf(" Graphics System Error: %s\n", grapherrormsg( ErrorCode ) );
  197.         exit( 1 );
  198.     }
  199.  
  200.     MaxColors = getmaxcolor() + 1;   /* Read maximum number of colors*/
  201.  
  202.     MaxX = getmaxx();
  203.     MaxY = getmaxy();           /* Read size of screen        */
  204.  
  205.     getaspectratio( &xasp, &yasp );  /* read the hardware aspect   */
  206.     AspectRatio = (double)xasp / (double)yasp; /* Get correction factor */
  207.  
  208. }
  209.  
  210. void StatusLine( char *msg )
  211. {
  212.     int height;
  213.     setviewport( 0, 0, MaxX, MaxY, 1 );   /* Open port to full screen   */
  214.     setcolor( MaxColors - 1 );       /* Set current color to white */
  215.     changetextstyle( DEFAULT_FONT, HORIZ_DIR, 1 );
  216.     settextjustify( CENTER_TEXT, TOP_TEXT );
  217.     setlinestyle( SOLID_LINE, 0, NORM_WIDTH );
  218.     setfillstyle( EMPTY_FILL, 0 );
  219.     height = textheight( "H" );           /* Detemine current height      */
  220.     bar( 0, MaxY-(height+4), MaxX, MaxY );
  221.     rectangle( 0, MaxY-(height+4), MaxX, MaxY );
  222.     outtextxy( MaxX/2, MaxY-(height+2), msg );
  223.     setviewport( 1, height+5, MaxX-1, MaxY-(height+5), 1 );
  224.  
  225. }
  226.  
  227. /*#################################################*/
  228.  
  229. void main()  {
  230.     int menu_nbr;
  231.     char again = 'y';
  232.     Initialize();
  233.     while  (again == 'y')   {
  234.         restorecrtmode();
  235.         clrscr();
  236.         logo();
  237.         menu_nbr = menu();
  238.         switch (menu_nbr) {
  239.         case 1:
  240.             autoloid();
  241.             break;
  242.         case 2:
  243.             circloid();
  244.             break;
  245.         case 3:
  246.             asteroid();
  247.             break;
  248.         case 4:
  249.             spiral();
  250.             break;
  251.         case 5:
  252.             lissajous();
  253.             break;
  254.         case 6:
  255.             tschirnhausen();
  256.             break;
  257.